package com.hd.trans.widgets;

import android.util.Log;

import org.jetbrains.annotations.NotNull;

import java.util.concurrent.TimeUnit;

import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;


/**
 * 倒计时器
 */
public abstract class RxCountDownTimer {
    private final String tag = "RxCountDownTimer";

    private long mSecond = 60;

    public RxCountDownTimer(long second) {
        this.mSecond = second;
    }

    private Disposable mDisposable = null;

    public void start() {
        // 避免重复开启倒计时
        if (mDisposable != null && !mDisposable.isDisposed()) {
            return;
        }
        // 第一个参数 序列的起点
        // 第二个参数 事件的数量
        // 第三个参数 首次事件延迟发送的事件
        // 第四个参数 事件发送间隔时间
        // 第五个参数 时间单位
        Observable.intervalRange(0,
                // onNext从0开始，加1次； onComplete延后1s ，加1次;合计加2s。
                mSecond + 2, 0, 1, TimeUnit.SECONDS)
                // 在子线程在执行计时
                .subscribeOn(Schedulers.io())
                // 在主线程上更新UI
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<Long>() {
                    @Override
                    public void onSubscribe(@NotNull Disposable d) {
                        mDisposable = d;
                        Log.d(tag, "onSubscribe");
                    }

                    @Override
                    public void onNext(@NotNull Long value) {
                        Log.d(tag, "onNext " + value);
                        // 倒计时剩余时间
                        long countDownTime = mSecond - value;
                        if (countDownTime >= 0) {
                            onTick(TimeUnit.SECONDS.toMillis(mSecond - value));
                        }
                    }

                    @Override
                    public void onError(@NotNull Throwable e) {
                        Log.d(tag, "onError " + e.getMessage());
                        onFinish();
                        if (mDisposable != null) {
                            mDisposable.dispose();
                        }
                    }

                    @Override
                    public void onComplete() {
                        Log.d(tag, "onComplete ");
                        onFinish();
                        if (mDisposable != null) {
                            mDisposable.dispose();
                        }
                    }
                });
    }

    public void pause() {
        if (mDisposable != null) {
            mDisposable.dispose();
        }
    }

    public void cancel() {
        if (mDisposable != null) {
            mDisposable.dispose();
            mDisposable = null;
        }
    }


    public abstract void onTick(long millisUntilFinished);

    public abstract void onFinish();
}
